# This is a sample Python script.

# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.


def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press ⌘F8 to toggle the breakpoint.

# 根据本文提出的改进的最小-最大（min-max）调度方法，我
# 们可以设计一个Python实现来模拟和优化电池储能系统（BESS）的容量和操作。
# 以下是基于本文描述的算法的Python实现。这个实现将包括以下几个关键部分：
# BESS的基本容量计算。
# 优化BESS容量。
# 短期功率调度控制算法。
# 平滑两个相邻调度间隔之间的功率调度。
# 1. 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
# 2. 定义基本参数
# 基本参数

Td = 15  # 调度间隔（分钟）
confidence_interval = 0.03  # 预测置信区间

SOC_l = 0.1     # BESS的SOC下限
SOC_u = 0.6     # BESS的SOC上限

DOD = 0.6  # 最优放电深度
unit_cost = 550  # BESS单位成本（$/kWh）
rated_capacity = 1000  # PV单元的额定容量（W）

# 3. 模拟PV功率输出
# 假设我们有一个1kW的实验性PV系统，我们随机生成一年的PV功率输出数据。
np.random.seed(42)
time = np.arange(0, 365 * 24 * 60, Td)  # 一年的时间点（分钟）
PV_power = np.random.uniform(0, rated_capacity, len(time))  # 随机生成PV功率

# 4. 计算BESS的基本容量
# 计算BESS的基本容量
def calculate_basic_capacity(PV_power, Td):

    max_power_rating = max(abs(np.diff(PV_power)))  # 最大功率需求
    max_energy_rating = max(np.cumsum(np.diff(PV_power)))  # 最大能量需求
    basic_capacity = {
        'power_rating': max_power_rating,
        'energy_rating': max_energy_rating * 2  # 保证不出现过充或过放
    }
    return basic_capacity

basic_capacity = calculate_basic_capacity(PV_power, Td)
print(f"Basic BESS Capacity: Power Rating = {basic_capacity['power_rating']} W, Energy Rating = {basic_capacity['energy_rating']} Wh")
# 5. 优化BESS容量
# 优化BESS容量
def optimize_BESS_capacity(PV_power, Td, SOC_l, SOC_u, DOD, unit_cost):
    max_power_rating = max(abs(np.diff(PV_power)))
    max_energy_rating = max(np.cumsum(np.diff(PV_power))) * 2
    optimal_capacity = max_energy_rating * DOD
    life_cycle_cost = optimal_capacity * unit_cost
    return optimal_capacity, life_cycle_cost

optimal_capacity, life_cycle_cost = optimize_BESS_capacity(PV_power, Td, SOC_l, SOC_u, DOD, unit_cost)
print(f"Optimal BESS Capacity: {optimal_capacity} Wh, Life Cycle Cost: ${life_cycle_cost}")
# 6. 短期功率调度控制算法
# 短期功率调度控制算法
def short_term_power_dispatch(PV_power, Td, SOC_l, SOC_u, DOD):
    SOC = 0.5  # 初始SOC
    dispatch_power = np.zeros(len(PV_power))
    for i in range(1, len(PV_power)):
        if PV_power[i] > PV_power[i-1]:  # 充电
            dispatch_power[i] = min(PV_power[i], SOC_u * optimal_capacity / Td)
            SOC = SOC + dispatch_power[i] / optimal_capacity
        else:  # 放电
            dispatch_power[i] = max(PV_power[i], SOC_l * optimal_capacity / Td)
            SOC = SOC - dispatch_power[i] / optimal_capacity
    return dispatch_power

dispatch_power = short_term_power_dispatch(PV_power, Td, SOC_l, SOC_u, DOD)
# 7. 平滑两个相邻调度间隔之间的功率调度
# Python复制
# 平滑两个相邻调度间隔之间的功率调度
def smooth_power_dispatch(dispatch_power, Td, ramp_rate_limit):
    smoothed_dispatch_power = np.copy(dispatch_power)
    for i in range(1, len(dispatch_power)):
        if abs(dispatch_power[i] - dispatch_power[i-1]) > ramp_rate_limit:
            smoothed_dispatch_power[i] = dispatch_power[i-1] + np.sign(dispatch_power[i] - dispatch_power[i-1]) * ramp_rate_limit
    return smoothed_dispatch_power

ramp_rate_limit = 50  # 功率斜率限制（W/min）
smoothed_dispatch_power = smooth_power_dispatch(dispatch_power, Td, ramp_rate_limit)
# 8. 可视化结果
# Python复制
plt.figure(figsize=(12, 6))
plt.plot(time / 60, PV_power, label='PV Power')
plt.plot(time / 60, dispatch_power, label='Dispatch Power')
plt.plot(time / 60, smoothed_dispatch_power, label='Smoothed Dispatch Power')
plt.xlabel('Time (hours)')
plt.ylabel('Power (W)')
plt.legend()
plt.title('PV Power and Dispatch Power')
plt.show()
# 9. 完整代码
# 将上述代码片段组合成一个完整的Python脚本，可以运行并观察结果。这个实现提供了一个基本框架，可以根据具体需求进一步优化和扩展。
# 注意事项
# 本文的算法假设了PV功率输出是已知的，实际应用中需要结合具体的预测模型。
# 功率斜率限制和SOC范围等参数需要根据实际系统进行调整。
# 代码中的随机生成PV功率部分仅用于模拟，实际应用中应使用实际测量数据。
# 这个实现提供了一个基本的框架，可以根据具体需求进一步优化和扩展。

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('PyCharm')

# See PyCharm help at https://www.jetbrains.com/help/pycharm/



